class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        int len=0;
        for(auto p=head;p!=NULL;p=p->next)
            len++;
        auto newhead=new ListNode(0,head);
        auto p0=newhead;
        auto cur=head;
        ListNode* pre=NULL;
        for(;len>=k;len-=k){
            for(int i=0;i<k;i++){
                auto nxt=cur->next;
                cur->next=pre;
                pre=cur;
                cur=nxt;
            }
            auto q=p0->next;
            p0->next->next=cur;
            p0->next=pre;
            p0=q;
        }
        return newhead->next;
    }
};